#include <bits/stdc++.h>
using namespace std;

const long long INF = (1LL<<60);

vector<long long> dijkstra(int n, const vector<vector<pair<int,int>>>& g, int src){
    vector<long long> dist(n, INF);
    dist[src]=0;
    using P = pair<long long,int>; // dist, node
    priority_queue<P, vector<P>, greater<P>> pq;
    pq.push({0,src});
    while(!pq.empty()){
        auto [d,u] = pq.top(); pq.pop();
        if(d!=dist[u]) continue; // 过期
        for(auto [v,w]: g[u]){
            if(dist[v] > d + w){
                dist[v] = d + w;
                pq.push({dist[v], v});
            }
        }
    }
    return dist;
}

int main(){
    ios::sync_with_stdio(false); cin.tie(nullptr);
    // 示例有向图（非负权） 0..5
    int n=6; vector<vector<pair<int,int>>> g(n);
    auto add=[&](int u,int v,int w){ g[u].push_back({v,w}); };
    add(0,1,7); add(0,2,9); add(0,5,14);
    add(1,2,10); add(1,3,15);
    add(2,3,11); add(2,5,2);
    add(3,4,6);
    add(5,4,9);

    int src=0; auto dist = dijkstra(n, g, src);
    cout << "Dijkstra 从源点 " << src << " 的最短距離:\n";
    for(int i=0;i<n;i++){
        cout << "0 -> " << i << ": ";
        if(dist[i]>=INF/2) cout << "INF\n"; else cout << dist[i] << "\n";
    }
    return 0;
}

